/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucue.recomendacionsakila.ui;

import edu.ucue.recomendacionsakila.mdl.Actor;
import edu.ucue.recomendacionsakila.mdl.Category;
import edu.ucue.recomendacionsakila.mdl.Customer;
import edu.ucue.recomendacionsakila.mdl.Film;
import edu.ucue.recomendacionsakila.neg.CustomerManager;
import edu.ucue.recomendacionsakila.neg.FilmManager;
import edu.ucue.recomendacionsakila.util.Atributo;
import edu.ucue.recomendacionsakila.util.GenericUtils;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 *
 * @author Johnny
 */
public class pruebaAlgoritmos {

    static CustomerManager cm = new CustomerManager();
    static FilmManager fm = new FilmManager();
    static HashMap<Actor, Double> mapaPuntajeActores;
    static HashMap<Category, Double> mapaPuntajeCategorias;
    static HashMap<String, Double> mapaPuntajeClasificacion;

    public static void main(String args[]) {
        List<Customer> listaPersonas = cm.getCustomers();
        List<Film> listaPeliculas = fm.getFilms(listaPersonas.get(6));
        List<Film> listaCompletaPeliculas = fm.getFilms();

        for (int i = 0; i < listaPeliculas.size(); i++) {
            if (listaCompletaPeliculas.contains(listaPeliculas.get(i))) {
                listaCompletaPeliculas.remove(listaPeliculas.get(i));
            }
        }
        mapaPuntajeActores = new GenericUtils<Actor>().obtenPuntajes(obtenActoresVistos(listaPeliculas), 2.5);
        mapaPuntajeCategorias = new GenericUtils<Category>().obtenPuntajes(obtenCategoriasVistas(listaPeliculas), 2.5);
        mapaPuntajeClasificacion = new GenericUtils<String>().obtenPuntajes(obtenClasificacionesVistas(listaPeliculas), 1);
        List<Atributo<Film>> listaPeliculasPuntuadas = rankeaPeliculas(mapaPuntajeActores, mapaPuntajeCategorias,mapaPuntajeClasificacion,listaCompletaPeliculas);
        System.out.println("------------------Listo--------------");

        for (int i = 0; i < 10; i++) {
            System.out.println(listaPeliculasPuntuadas.get(i).getObjeto().getFilmId() + "   " + listaPeliculasPuntuadas.get(i).getObjeto().getTitle() + " --> "+listaPeliculasPuntuadas.get(i).getObjeto().getRating() + listaPeliculasPuntuadas.get(i).getValor() + "---> " + getActores(listaPeliculasPuntuadas.get(i).getObjeto()) + " " + getGenero(listaPeliculasPuntuadas.get(i).getObjeto()));
        }
    }

    public static List<Atributo<Category>> obtenCategoriasVistas(List<Film> listaPeliculas) {
        List<Atributo<Category>> listaCategoriasVistas = new ArrayList<Atributo<Category>>();
        for (int i = 0; i < listaPeliculas.size(); i++) {
            for (int j = 0; j < listaPeliculas.get(i).getFilmCategoryList().size(); j++) {
                boolean existe = false;
                for (int k = 0; k < listaCategoriasVistas.size(); k++) {
                    if (listaCategoriasVistas.get(k).getObjeto().equals(listaPeliculas.get(i).getFilmCategoryList().get(j).getCategory())) {
                        existe = true;
                        listaCategoriasVistas.get(k).setValor(listaCategoriasVistas.get(k).getValor() + 1);
                        break;
                    }
                }
                if (!existe) {
                    Atributo<Category> categoria = new Atributo<Category>();
                    categoria.setObjeto(listaPeliculas.get(i).getFilmCategoryList().get(j).getCategory());
                    categoria.setValor(1d);
                    categoria.setAtributo("Categoria");
                    listaCategoriasVistas.add(categoria);
                }
            }
        }
        new GenericUtils<Category>().ordenaAtributos(listaCategoriasVistas);

        for (int i = 0; i < listaCategoriasVistas.size(); i++) {
            System.out.println(listaCategoriasVistas.get(i).getObjeto().getName() + "   " + listaCategoriasVistas.get(i).getValor());
        }
        return listaCategoriasVistas;
    }

    public static List<Atributo<Actor>> obtenActoresVistos(List<Film> listaPeliculas) {
        List<Atributo<Actor>> listaActoresVistos = new ArrayList<Atributo<Actor>>();
        for (int i = 0; i < listaPeliculas.size(); i++) {
            for (int j = 0; j < listaPeliculas.get(i).getFilmActorList().size(); j++) {
                boolean existe = false;
                for (int k = 0; k < listaActoresVistos.size(); k++) {
                    if (listaActoresVistos.get(k).getObjeto().equals(listaPeliculas.get(i).getFilmActorList().get(j).getActor())) {
                        existe = true;
                        listaActoresVistos.get(k).setValor(listaActoresVistos.get(k).getValor() + 1);
                        break;
                    }
                }
                if (!existe) {
                    Atributo<Actor> actor = new Atributo<Actor>();
                    actor.setObjeto(listaPeliculas.get(i).getFilmActorList().get(j).getActor());
                    actor.setValor(1d);
                    actor.setAtributo("Actor");
                    listaActoresVistos.add(actor);
                }
            }
        }
        new GenericUtils<Actor>().ordenaAtributos(listaActoresVistos);

        for (int i = 0; i < listaActoresVistos.size(); i++) {
            System.out.println(listaActoresVistos.get(i).getObjeto().getFirstName() + " " + listaActoresVistos.get(i).getObjeto().getLastName() + "   " + listaActoresVistos.get(i).getValor());
        }
        return listaActoresVistos;
    }

    public static List<Atributo<Film>> rankeaPeliculas(HashMap<Actor, Double> mapaActores, HashMap<Category, Double> mapaCategorias, HashMap<String, Double> mapaClasificacione, List<Film> listaPeliculas) {
        List<Atributo<Film>> listaPuntajes = new ArrayList<Atributo<Film>>();
        for (int i = 0; i < listaPeliculas.size(); i++) {
            Atributo<Film> pelicula = new Atributo<Film>();
            pelicula.setObjeto(listaPeliculas.get(i));
            double puntajeActores = 0;
            for (int j = 0; j < listaPeliculas.get(i).getFilmActorList().size(); j++) {
                if (mapaActores.containsKey(listaPeliculas.get(i).getFilmActorList().get(j).getActor())) {
                    puntajeActores += mapaActores.get(listaPeliculas.get(i).getFilmActorList().get(j).getActor());
                }
            }
            puntajeActores = puntajeActores / (double) listaPeliculas.get(i).getFilmActorList().size();
            double puntajeCategorias = 0;
            for (int j = 0; j < listaPeliculas.get(i).getFilmCategoryList().size(); j++) {
                if (mapaCategorias.containsKey(listaPeliculas.get(i).getFilmCategoryList().get(j).getCategory())) {
                    puntajeCategorias += mapaCategorias.get(listaPeliculas.get(i).getFilmCategoryList().get(j).getCategory());
                }
            }
            //puntajeCategorias= puntajeCategorias/listaPeliculas.get(i).getFilmCategoryList().size();
            double puntajeClasificacion=0;
            if(mapaClasificacione.containsKey(listaPeliculas.get(i).getRating()))
            {
                puntajeClasificacion=mapaClasificacione.get(listaPeliculas.get(i).getRating());
            }
            
            double puntajePelicula = puntajeActores + puntajeCategorias + puntajeClasificacion;
            pelicula.setValor(puntajePelicula);
            pelicula.setAtributo("Film");
            listaPuntajes.add(pelicula);

        }
        new GenericUtils<Film>().ordenaAtributos(listaPuntajes);

        return listaPuntajes;
    }

    public static List<Atributo<String>> obtenClasificacionesVistas(List<Film> listaPeliculas) {
        List<Atributo<String>> listaClasificacionesVistas = new ArrayList<Atributo<String>>();
        for (int i = 0; i < listaPeliculas.size(); i++) {
            boolean existe = false;
            for (int j = 0; j < listaClasificacionesVistas.size(); j++) {
                if (listaClasificacionesVistas.get(j).getObjeto().equals(listaPeliculas.get(i).getRating())) {
                    existe = true;
                    listaClasificacionesVistas.get(j).setValor(listaClasificacionesVistas.get(j).getValor() + 1);
                    break;
                }
            }
            if (!existe) {
                Atributo<String> clasificacion = new Atributo<String>();
                clasificacion.setAtributo("Rating");
                clasificacion.setObjeto(listaPeliculas.get(i).getRating());
                clasificacion.setValor(1);
                listaClasificacionesVistas.add(clasificacion);
            }
        }
        new GenericUtils<String>().ordenaAtributos(listaClasificacionesVistas);
        for(int i=0;i<listaClasificacionesVistas.size();i++)
        {
            System.out.println(listaClasificacionesVistas.get(i).getObjeto()+"-->"+listaClasificacionesVistas.get(i).getValor());
        }
        return listaClasificacionesVistas;
    }

    static String getGenero(Film pelicula) {
        String generos = "";
        for (int i = 0; i < pelicula.getFilmCategoryList().size(); i++) {
            generos += pelicula.getFilmCategoryList().get(i).getCategory().getName() + ", ";
        }
        return generos;
    }

    static String getActores(Film pelicula) {
        String actores = "";
        for (int i = 0; i < pelicula.getFilmActorList().size(); i++) {
            actores += pelicula.getFilmActorList().get(i).getActor().getFirstName() + " " + pelicula.getFilmActorList().get(i).getActor().getLastName() + "=" + mapaPuntajeActores.get(pelicula.getFilmActorList().get(i).getActor()) + ", ";
        }
        return actores;
    }
}
